package com.mgxy.learn;

/**
 * 未解耦合    个人学习版
 */

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class BallGame_Learn extends  JFrame {
    /** 双缓存解决闪动问题 */
    Image offScreenImage = null;
    /** 获取桌面图片 */
    Image desk = Toolkit.getDefaultToolkit().getImage("imgs/desk.jpg");
    /** 获取白球图片 */
    Image ballWhite = Toolkit.getDefaultToolkit().getImage("imgs/ball.png");

    //定义白球的运动水平方向默认坐标
    double x = 200;
    //定义白球的垂直运动方向的坐标
    double y = 200;
    //定义成员变量 白球的移动速度
    double speed = 20;
    //设置白球的移动角度
    double degree = Math.PI / 3;

    //定义起始点(startx,starty) 终点(endx,endy);
    double startx;
    double starty;
    double endx;
    double endy;
    //是否显示红线
    boolean isShow =false;

    /** 窗口创建启动方法 */
    public void launch(){
        //设置窗口大小
        setSize(856,501);
        //设置窗口的位置
        setLocation(100,200);
        //设置窗口标题
        setTitle("桌球小游戏----By MG斜阳");
        //设置关闭事件
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置窗口是否可见
        setVisible(true);

        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getButton() == 1){
                    //获取白球心坐标  球心的计算从球左上方开始，所以需要加上球的一半
                    startx = x+15;
                    starty = y+15;
                    //获得终点坐标  鼠标点击区域
                    endx = e.getX();
                    endy = e.getY();
                    //获取向量角度
                    //改变白球运动方向
                    degree = getAngle(startx,starty,endx,endy);
                    isShow = true;
                }else if (e.getButton() ==3){
                    speed = 20;
                    isShow = false;
                }
                super.mouseClicked(e);

            }
        });

        while (true){
            repaint();
            try {
                //暂停40毫秒，相当于1秒钟执行(1000/40 = 25)次 repaint()方法
                Thread.sleep(40);
            } catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    @Override
    public void paint(Graphics g){
        /** 创建和容器一样大小的Image图片 */
        if(offScreenImage ==null){
            offScreenImage=this.createImage(856, 501);
        }
        /** 获得该图片的画布*/
        Graphics gImage= offScreenImage.getGraphics();
        /** 填充整个画布*/
        gImage.fillRect(0, 0, 856, 501);
        //绘制台球桌面
        gImage.drawImage(desk,0,20,null);
        //绘制白球
        gImage.drawImage(ballWhite,(int) x,(int) y,null);
        //绘制直线
        gImage.setColor(Color.RED);
        if(isShow){
            gImage.drawLine((int) startx,(int)starty,(int)endx,(int)endy);
        }
        /** 将缓冲区绘制好哦的图形整个绘制到容器的画布中 */
        g.drawImage(offScreenImage, 0, 0, null);

        if (speed > 0){
            //每次调用paint方法speed递减0.15，实现白球逐渐停止的效果
            speed -= 0.15;
            //x的运动到逐渐停止
            x += speed * Math.cos(degree);
            y += speed * Math.sin(degree);
        }

        //碰到上下边缘
        if(y<60 || y>440){
            degree = -degree;
        }
        //碰到左右边缘
        if(x<30 || x>800){
            degree = Math.PI - degree;
        }
    }

    /** 获取任意两个点所成的向量角度 0——2 * Math.PI */
    public double getAngle(double startx,double starty,double endx,double endy){
        double tempx = endx - startx;
        double tempy = endy - starty;
        //对角线长度
        double z = Math.sqrt(tempx * tempx + tempy * tempy);
        //角度   0到1.57    相当于 0到pi/2
        double angle = (float)(Math.asin(Math.abs(tempy)/z));

        if (tempx > 0 && tempy < 0){
            //第一象限，得到270-360的角度
            angle = Math.PI * 2 - angle;
        } else if (tempx < 0 && tempy < 0){
            //第二象限
            angle = Math.PI + angle;
        } else if (tempx < 0 && tempy > 0){
            //第三象限
            angle = Math.PI - angle;
        } else if (tempx > 0 && tempy > 0){
            //第四象限，角度不用改变
        }
        return angle;
    }

    public static void main(String[] args) {
        BallGame_Learn bg = new BallGame_Learn();
        bg.launch();
    }

}
